def findroot(x):
    if x==p[x]:
        return x
    p[x]=findroot(p[x])
    return p[x]

n,m=map(int,input().split())
p=list(range(n+1))

# 邻接表存储图
g=[[] for i in range(n)]
for _ in range(m):
    x,y=map(int,input().split())
    g[x].append(y)
    g[y].append(x)

k=int(input())
# 被摧毁的点
destory=[]
# 标记是否被摧毁
vist=[0]*n
for _ in range(k):
    x=int(input())
    destory.append(x)
    vist[x]=1

# 连通数
rest=n-k

# 反向添加点
# 最初始 的状态
for u in range(n):
    if vist[u]: continue
    for v in g[u]: # 连接<u,v>
        # 判断点v
        if vist[v]: continue
        rootx,rooty=findroot(u),findroot(v)
        # 如果不在同一个连通分量中
        if rootx!=rooty:
            p[rootx]=rooty
            rest-=1
ans=[rest]

# 倒叙 逐步添加边
for u in destory[::-1]:
    vist[u]=0
    rest+=1
    for v in g[u]:
        if vist[v]: continue
        rootx,rooty=findroot(u),findroot(v)
        if rootx!=rooty:
            p[rootx]=rooty
            rest-=1
    ans.append(rest)
print(*ans[::-1],sep='\n')


